--[[
一、Lua支持的所有字符类。上面字符类的大写形式表示小写所代表的集合的补集，'%A'非字母的字符：
  %s 空白符
  . 任意字符
  %p 标点字符
  %c 控制字符
  %d 数字
  %x 十六进制数字
  %z 代表0的字符
  %a 字母
  %l 小写字母
  %u 大写字母
  %w 字母和数字

二、在模式串中(匹配串)，特殊字符 ().%+-*?[^$   用%转义
'%'用作特殊字符的转义字符，转义字符'%'不仅可以用来转义特殊字符，还可以用于所有的非字母的字符。当对一个字符有疑问的时候，为安全起见请使用转义字符转义他。
  '%.' 匹配点；
  '%%' 匹配字符 '%'。
  '%？' 匹配字符 '？'。

三、用'[]'创建字符集
  '[%w_]' 匹配字母数字和下划线
  '[01]' 匹配二进制数字
  '[\"']' 匹配 \ " '三个字符

  在'[]'中使用连字符'-'
  '[0-9]'    表示 '%d'；
  '[0-9a-fA-F]' 表示 '%x'
  '[0-7]' 表示 '[01234567]'

  在'[]'开始处使用 '^' 表示其补集：
  '[^0-7]' 匹配任何不是八进制数字的字符；
  '[^\n]' 匹配任何非换行符户的字符。
  '[^%s]' == '%S' 

四、模式串修饰符 例如 '%a+'
  + 匹配前一字符1次或多次 '%a+'代表连续的字符，'m+代表屁匹配 m mm mmm ...'
  * 匹配前一字符0次或多次;最长匹配
  - 匹配前一字符0次或多次;最短匹配
  ? 匹配前一字符0次或1次
  ^ 匹配字符串开头
  $ 匹配字符串结尾

五、捕获：用()将要捕获的部分包围起来,把模式中一些我们想要的特殊字符保留下来供后面使用
  (%1-%9)拷贝捕获
  ()一个空的捕获，也就是小括号里面什么内容也没有，它会返回当前字符串的比较操作进行到的位置 
  只有find函数返回值里有 ()捕获的内容
]]


local str = "20170712183805-01-58120.ts?msisdn=12345678955&mdspid=&spid=699010&netType=4&sid=2051125170&pid=2028594089&Channel_ID=4010_01060300-99000-200700000010000&ProgramID=502592749&ParentNodeID=10271941&timestamp=20170717172736"

print(string.char(65, 66))--AB
print(string.upper("Hello Lua"))
print(string.lower("Hello Lua"))
print(string.len("hello lua"))
print(#("hello lua"))
print(string.rep("mytest",2))--mytestmytest


--string.find(s, pattern, start, plain) 
--这个函数的功能是查找字符串s中的指定的模式 pattern如果找到了一个模式的匹配，就返回找到的模式在 s 中的起点和终点
--start 指定在s中查找开始的位置，默认是1，start可以是负数，-1代表从最后一个字符开始，-2代表倒数第二个字符开始。
--plain是个 bool 值，默认是false，它指明第二个参数 pattern 中是否使用特殊字符，如果第四个参数指明为 true，那么就意味着第二个参数 pattern 中的那些特殊字符都被当作正常字符进行处理
print("-----------------find------------------")
print(string.find("name=fff,pass=Lua", "(%a+)=(%a+)"))--1	8	name	fff
print(string.find("name=fff,pass=Lua", "%a+=%a+"))--1	8
print(string.find(str, ".ts%?"))--24	27
local s = "am+df"
print(string.find(s, "m+", 1, false))    -- 2    2
print(string.find(s, "m+", 1, true))    -- 2    3

pair = "name = Anna"
s = "abc \"it\'s a cat\""
firstidx, lastidx, key, value = string.find(pair, "(%a+)%s*=%s*(%a+)")
print(string.find(pair, "(%a+)%s*=%s*(%a+)")) --1	11	name	Anna
--拷贝捕获(%1-%9)
print(string.find(s, "([\"'])(.-)%1")) --5	16	"	it's a cat



--替换string.gsub(s, pattern, rep, n)
--将目标字符串 s 中所有的子串 p 替换成字符串 r。可选参数 n，表示限制替换次数。
--rep 除了可以是一个字符串外，还可以是一个函数，甚至可以是一个table。
--返回值有两个，第一个是被替换后的字符串，第二个是替换了多少次
print("-----------------gsub------------------")
print(string.sub("Hello Lua", 4, 7))

print(string.gsub("Luaer Luaer Luatt", "Lua", "hello"))
print(string.gsub("Luatt Luaff Luagg", "Lua", "hello", 2))
print(string.gsub("Lua*t32423&*sfas21g", "*t", ""))
print(string.gsub("Lua*ttt32423&*sttfas21g", "t+", "-"))--Lua*-32423&*s-fas21g	2

--拷贝捕获(%1-%9) % 后面接数字 1-9 的时候，也就是用前面模式"捕获"的序号 1-9 对应的字符串来替换模式匹配的内容，这样说比较绕，还是看例子：
local s = "am*dmf"
print(string.gsub(s, "()(m+)", "%1"))-- a2*d5f 2  这个时候两个捕获分别是 2,m,那么%1也就是第一个捕获，也就是 2 
print(string.gsub(s, "(m+)()", "%2"))-- a3*d6f 2
print(string.gsub(s, "()(m+)", "%%"))-- a%+d%f    2

--当rep是一个函数的时候，每当匹配到字符串的时候，就把模式所有的捕获按照捕获顺序作为参数传递给这个函数
function f1(...)
	print(...)	-- 2	m    -- 5	m
	return "hh"
end
print(string.gsub(s, "()(m+)", f1))	-- ahh+dhhf	2



--string.gmatch(s, pattern)
--在字符串 s 中匹配（模式） 字符串 p，若匹配成功，则返回目标字符串中与模式匹配的子串；否则返回 nil。
--gmatch被当作迭代器进行调用，然后获得所有跟模式相匹配的串。math只匹配一次就返回
print("----------------gmathch-----------------")
print(string.match("today is 27/7/2015", "%d+/%d+/%d+"))--27/7/2015
print(string.match("date=19:16", "%a+=%d+:%d+"))--date=19:16
print(string.match("name=fff,pass=Lua", "%a+=%a+")) --name=fff
print(string.match("content-size:900,pass=Lua", "content%-size"))--注意转义
local uri = "jhgfjg.88"
print(uri:match(".+%.") or "not")

s = "hello world from Lua"
for w in string.gmatch(s, "%a+") do --匹配最长连续且只含字母的字符串
  print(w)
end

t = {}
for k, v in string.gmatch(str, "(%a+)=(%d+)") do --匹配两个最长连续且只含字母的
  t[k] = v --字符串，它们之间用等号连接
end
for k, v in pairs(t) do
  print (k,v)
end

